/** 
$.ajax(
  url: '',
  type: 'POST',
  dataType: 'JSON'
  data: {
      status: 1    
  }
  success: function (data) {
      console.log(data)    
  }
)

$.get('url?state=1', function (data) {
  console.log(data)
})

$.post('url', {state: 1}, function (data) {
  console.log(data)
})
*/

/** 不是不行，只是 命名空间 方法比较老 */
// var $ = {
//   ajax: function (opt) {
//     var url = opt.url
//     console.log(url)
//   },
//   post: function () {
//     console.log('post')
//   },
//   get: function () {
//     console.log('get')
//   }
// }

// $.ajax({
//   url: 'www.baidu.com'
// })

/** 模块化方案 */

// IIFE 
// $().ajax()
// $.ajax()
function $() {
  return {
    ajax: function () {
      console.log('ajax')
    },
    get: function () {
      console.log('get')
    },
    post: function () {
      console.log('post')
    }
  }
}

const my_$ = (function () {
  var o = window.XMLHttpRequest ?
    new XMLHttpRequest() :
    new ActiveXObject('Microsofe.XMLHTTP')

  if (!o) {
    throw new Error('您的浏览器不支持异步的HTTP请求')
  }

  function _doAjax(opt) {
    var opt = opt || {},
      type = (opt.type || 'GET').toUpperCase()
    async = opt.async || true
    url = opt.url
    data = opt.data || null
    error = opt.error || function () { }
    success = opt.success || function () { }
    complate = opt.complate || function () { }

    if (!url) {
      throw new Error('您没有填写url地址')
    }

    o.open(type, url, async);
    type === 'POST' && o.setRequestHeader('Content-type', 'application/x-www-form-urlencode')
    o.send(type === 'GET' ? null : formatData(data))

    o.onreadystatechange = function () {
      if (o.readystate === 4 && o.state === 200) {
        success(JSON.parse(o.responseText))
      }

      if (o.state === 404) {
        error()
      }

      complate()
    }
  }

  function formatData(obj) {
    var str = ''

    for (var key in obj) {
      str += `${key}=${obj[key]}&`
    }

    return str.replace(/&$/, '')
  }

  return {
    ajax: function (opt) {
      _doAjax(opt)
    },
    get: function (url, callback) {
      _doAjax({
        url,
        callback,
        type: 'GET',
      })
    },
    post: function (url, data, callback) {
      _doAjax({
        url,
        type: 'POST',
        data,
        success: callback
      })
    }
  }
})()